package util

import (
	"reflect"
	"unsafe"
)

func ReflectSetInt(objField reflect.Value, i64 int64) {
	rValue := reflect.ValueOf(i64)
	if objField.CanSet() {
		objField.SetInt(rValue.Interface().(int64))
	} else {
		//当结构体中的属性为非导出时（即小写字母开始的属性）
		unexportField := reflect.NewAt(objField.Type(), unsafe.Pointer(objField.UnsafeAddr())).Elem()
		unexportField.SetInt(rValue.Interface().(int64))
	}
}

func ReflectSetFloat(objField reflect.Value, f64 float64) {
	rValue := reflect.ValueOf(f64)
	if objField.CanSet() {
		objField.SetFloat(rValue.Interface().(float64))
	} else {
		//当结构体中的属性为非导出时（即小写字母开始的属性）
		unexportField := reflect.NewAt(objField.Type(), unsafe.Pointer(objField.UnsafeAddr())).Elem()
		unexportField.SetFloat(rValue.Interface().(float64))
	}
}

func ReflectSetString(objField reflect.Value, str string) {
	rValue := reflect.ValueOf(str)
	if objField.CanSet() {
		objField.SetString(rValue.Interface().(string))
	} else {
		//当结构体中的属性为非导出时（即小写字母开始的属性）
		unexportField := reflect.NewAt(objField.Type(), unsafe.Pointer(objField.UnsafeAddr())).Elem()
		unexportField.SetString(rValue.Interface().(string))
	}
}

func ReflectSetStruct(objField reflect.Value, structValue reflect.Value) {
	rValue := reflect.ValueOf(structValue.Interface())
	if objField.CanSet() {
		objField.Set(rValue.Elem())
	} else {
		//当结构体中的属性为非导出时（即小写字母开始的属性）
		unexportField := reflect.NewAt(objField.Type(), unsafe.Pointer(objField.UnsafeAddr())).Elem()
		unexportField.Set(rValue.Elem())
	}
}

func ReflectSetSlice(objField reflect.Value, structValue reflect.Value) {
	rValue := reflect.ValueOf(structValue.Interface())
	if objField.CanSet() {
		objField.Set(rValue)
	} else {
		//当结构体中的属性为非导出时（即小写字母开始的属性）
		unexportField := reflect.NewAt(objField.Type(), unsafe.Pointer(objField.UnsafeAddr())).Elem()
		unexportField.Set(rValue)
	}
}
